www.gusucode.com > 有关虹膜特征提取的部分很有借鉴意义源码程序 > iris recognition.txt

    function iris(filename); 
 
im=(rgb2gray(imread(filename))); 
im=im(13:288, 1:342); 
j=double(im); 
[d1 d2]=size(j); 
f=0; 
 
%stand out iris-pupil by contrasting 
LOW=3; 
HIGH=175; 
for loop=1:2:LOW*2 
   for loop1=1:d1 
      for loop2=1:d2 
         if j(loop1,loop2)<LOW+loop 
            j(loop1,loop2)=0; 
         elseif j(loop1,loop2)>HIGH-loop 
            j(loop1,loop2)=255; 
         else 
            j(loop1,loop2)=round(j(loop1,loop2)/(HIGH-LOW-
2*loop)*255); 
         end 
      end 
   end 
end 
 
% filter bright pixels by using threshold brightness  
threshold=200; 
%f=f+1; figure(f), imshow(j), imagesc(j); 
 

29    Appendix B 
 
pupil= (j < threshold); 
%f=f+1; figure(f), imshow(pupil), imagesc(pupil); 
 
 
%filtering using area of a whole circle 
diameter=33; 
mid=(diameter+1)/2; 
bound=mid-1; 
con=7; 
dif=(con+1)/2-1; 
result=zeros(d1-mid, d2-mid); 
circle=imcircle(diameter); 
replace=imcircle(con); 
area=(diameter/2)^2*pi; 
for loop1 = 1 : d1 
   for loop2 = 1 : d2 
      if (loop1<mid | loop1>d1-mid | loop2<mid | loop2>d2-mid) 
         result(loop1,loop2)=0; 
      else 
         acc=0; 
         compare=pupil(loop1-bound : loop1+bound, loop2-bound : 
loop2+bound); 
         prod = circle.*compare; 
         acc=sum(sum(prod)); 
         if acc / area > 0.85 
            result(loop1-dif: loop1+dif, loop2-dif: loop2+dif) = 
ones(con,con); 
         else 
            result(loop1,loop2)=0; 
         end    
      end 
   end 
end 
 
iris=result; 
[d1 d2]=size(iris); 
  
%approximate center using weight centroid of pixels  
column_weights = [1:d2] .* sum(iris); 
column_centroid = round(sum(column_weights(:)) / sum(iris(:)));  
row_weights = [1:d1] .* sum(iris, 2)'; 
row_centroid = round(sum(row_weights(:)) / sum(iris(:)));  
f=f+1; figure(f), imshow(im),imagesc(im);pixval; 
%line([column_centroid, column_centroid], [1, d1]);  
%line([1, d2], [row_centroid, row_centroid]); 
 
%darken pupil 
im2=im; 
for loop=1:5 
   im2=histeq(im2); 
   for loop1=1:d1 
      for loop2=1:d2 
         if im2(loop1,loop2)<50+loop*10 
            im2(loop1,loop2)=0; 
         elseif im2(loop1,loop2)>160-loop*10 
            im2(loop1,loop2)=255; 
         end 
      end 
   end 
end 
 
 
     

30    Appendix B 
 
%find boundary of pupil using sudden change in sum of brightness of 
concentric circles 
im2=double(im2); 
pupilbound=73; 
centers=0; 
dev=2; 
pupilser=zeros((dev*2+1)^2, (pupilbound+1)/2); 
for loop1=-dev:dev 
   for loop2=-dev:dev 
      centers=centers+1; 
      for loop3=1:2:pupilbound 
         circle=double(bwperim(imcircle(loop3))); 
         pupilser(centers,(loop3+1)/2) = 
sum(sum(im2(row_centroid+loop1-(loop3-1)/2:row_centroid+loop1+(loop3-
1)/2 , column_centroid+loop2-(loop3-
1)/2:column_centroid+loop2+(loop3-
1)/2).*circle))/sum(sum(circle))*128; 
      end 
   end 
end 
 
pupilser=pupilser'; 
inner=zeros((pupilbound+1)/2, (dev*2+1)^2); 
for loop1=1 : (dev*2+1)^2 
   check=0; 
   radius=-1; 
   for loop2=1 : (pupilbound+1)/2 
      radius=radius+1; 
      check=check+pupilser(loop2,loop1); 
      if check > 0 
         inner(loop2,loop1)=check; 
         inner(loop2+1:(pupilbound+1)/2,loop1)=0; 
%      inner(2,loop1)=radius; 
         break; 
      end 
   end 
end 
 
[a1,b1]=max(inner); %a1=max of gradient in each test center, b1 is 
the correspond radius 
[a2,b2]=max(a1); %a2=max of all the gradients so b2 = correspoding 
test center 
pupilcenter=b2; 
pupilradius=b1(b2);   %b2 is the center and b1(b2) is the center's 
radius 
 
pupilcenter_x=column_centroid+(-(dev+1)+rem(pupilcenter,dev*2+1)); 
pupilcenter_y=row_centroid+-((dev+1)-((pupilcenter - 
rem(pupilcenter,dev*2+1)) / (dev*2+1)+1)); 
hold on; o=0:.01:2*pi; plot(pupilradius*cos(o)+pupilcenter_x, 
pupilradius*sin(o)+pupilcenter_y); 
ph=line([pupilcenter_x, pupilcenter_x], [pupilcenter_y -10, 
pupilcenter_y+10]); 
pv=line([pupilcenter_x-10, pupilcenter_x+10], [pupilcenter_y, 
pupilcenter_y]); 
hold off; 
f=f+1; figure(f); plot((pupilser)); 
 
%find iris boundary 
%darken iris 
im2=im; 
 
     

31    Appendix B 
 
for loop=1:5 
   im2=histeq(im2); 
   for loop1=1:d1 
      for loop2=1:d2 
         if im2(loop1,loop2)<60+loop*10 
            im2(loop1,loop2)=0; 
         elseif im2(loop1,loop2)>170-loop*10 
            im2(loop1,loop2)=255; 
         end 
      end 
   end 
end 
 
im2=double(im2); 
irisbound=163; 
centers=0; 
dev=2; 
irisser=zeros((dev*2+1)^2, (irisbound+1)/2); 
for loop1=-dev:dev 
   for loop2=-dev:dev 
      counter=(pupilbound+1)/2-1; 
      centers=centers+1; 
      jump=0; 
      for loop3=pupilbound:2:irisbound 
         counter=counter+1; 
         jump=jump+2; 
         circle=double(bwperim(imcircle(loop3))); 
         circle(1:(loop3+1)/2-(pupilbound+1)/2, :)=0; 
         circle((loop3+1)/2+(pupilbound+1)/2:loop3, :)=0;  
         irisser(centers,counter) = sum(sum(im2(pupilcenter_y+loop1 -
((loop3+1)/2-1):pupilcenter_y+loop1+((loop3+1)/2-1) , 
pupilcenter_x+loop2-((loop3+1)/2-1) : 
pupilcenter_x+loop2+((loop3+1)/2-1)).*circle))/sum(sum(circle))*128; 
      end 
   end 
end 
 
irisser=irisser'; 
irisgrad=gradient(irisser'); 
irisgrad=irisgrad'; 
 
[g1,g2]=size(irisgrad); 
for loop1=g1 
   for loop2=g2 
      if irisgrad(loop1,loop2)<0 
         irisgrad(loop1,loop2)=0; 
      end 
   end 
end 
 
[i1,j1]=max(irisgrad); %i1=max of gradient in each test center, j1 is 
the correspond radius 
[i2,j2]=max(i1); %i2=max of all the gradients so j2 = correspoding 
test center 
iriscenter=j2; 
irisradius=j1(j2); 
 
iriscenter_x=pupilcenter_x+(-(dev+1)+rem(iriscenter,dev*2+1)); 
iriscenter_y=pupilcenter_y+-((dev+1)-((iriscenter - 
rem(iriscenter,dev*2+1)) / (dev*2+1)+1)); 
 
     

32    Appendix B 
 
figure(1); hold on; o=0:.01:2*pi; 
plot(irisradius*cos(o)+iriscenter_x, 
irisradius*sin(o)+iriscenter_y,'r'); 
ih=line([iriscenter_x-20, iriscenter_x+20], [iriscenter_y+20, 
iriscenter_y-20]); 
iv=line([iriscenter_x-20, iriscenter_x+20], [iriscenter_y-20, 
iriscenter_y+20]); 
set(ih,'color',[1 0 0]); set(iv,'color',[1 0 0]); 
l1=line([pupilcenter_x, iriscenter_x], [pupilcenter_y+pupilradius, 
iriscenter_y+irisradius]); 
l2=line([pupilcenter_x+pupilradius, iriscenter_x+irisradius], 
[pupilcenter_y, iriscenter_y]); 
l3=line([pupilcenter_x, iriscenter_x], [pupilcenter_y -pupilradius, 
iriscenter_y-irisradius]); 
l4=line([pupilcenter_x-pupilradius, iriscenter_x-irisradius], 
[pupilcenter_y, iriscenter_y]); 
set(l1,'color',[1 1 0]); set(l2,'color',[1 1 0]);set(l3,'color',[1 1 
0]); set(l4, 'color',[1 1 0]); 
line; 
hold off;